/***********************************************************************************************/ /**
*\n  @file       vdebug.h
*\n  @brief      调试信息
*\n  @details
*\n -----------------------------------------------------------------------------------
*\n  文件说明：
*\n       1. 调试信息
*\n       2. 定义五级调试信息： 1严重错误、2错误、3告警、4情报、5调试、
*\n       4. 用户根据需要，调整信息级别门限 DEBUG_LEVEL:
*\n          =0  不输出任何信息(默认级别)
*\n          =1  输出 1严重错误、
*\n          =2  输出 1严重错误、2错误、
*\n          =3  输出 1严重错误、2错误、3告警、
*\n          =4  输出 1严重错误、2错误、3告警、4情报、
*\n          >=5 输出 1严重错误、2错误、3告警、4情报、5调试、
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01   罗先能        2021.4.8          创建
*\n
***************************************************************************************************/
#pragma once
#ifndef H_8614987F_15CB_485F_81D8_15CE8BCC9F30
#define H_8614987F_15CB_485F_81D8_15CE8BCC9F30
#ifdef __cplusplus
extern "C"
{
#endif

/**************************************************************************************************
* 头文件
***************************************************************************************************/
#include <stdio.h>
#include <stdint.h>

/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/
#ifndef DEBUG_LEVEL
#define DEBUG_LEVEL 0 // 不输出任何信息(默认级别)
#endif

#define DEBUG_FATAL 1
#define DEBUG_ERROR 2
#define DEBUG_WARN 3
#define DEBUG_INFO 4
#define DEBUG_PRINTF 5

/// 前景颜色
#define PCL_ADD()
#define PCL_BLACK 		"\e[0;30m"
#define PCL_L_BLACK 	"\e[1;30m"
#define PCL_RED 		"\e[0;31m"
#define PCL_L_RED 		"\e[1;31m"
#define PCL_GREEN 		"\e[0;32m"
#define PCL_L_GREEN 	"\e[1;32m"
#define PCL_BROWN 		"\e[0;33m"
#define PCL_YELLOW 		"\e[1;33m"
#define PCL_BLUE 		"\e[0;34m"
#define PCL_L_BLUE 		"\e[1;34m"
#define PCL_PURPLE 		"\e[0;35m"
#define PCL_L_PURPLE 	"\e[1;35m"
#define PCL_CYAN 		"\e[0;36m"
#define PCL_L_CYAN 		"\e[1;36m"
#define PCL_GRAY 		"\e[0;37m"
#define PCL_WHITE 		"\e[1;37m"
//背景颜色
#define PCL_BG_BLACK 		"\e[0;40m"
#define PCL_BG_L_BLACK 		"\e[1;40m"
#define PCL_BG_RED 			"\e[0;41m"
#define PCL_BG_L_RED 		"\e[1;41m"
#define PCL_BG_GREEN 		"\e[0;42m"
#define PCL_BG_L_GREEN 		"\e[1;42m"
#define PCL_BG_BROWN 		"\e[0;43m"
#define PCL_BG_YELLOW 		"\e[1;43m"
#define PCL_BG_BLUE 		"\e[0;44m"
#define PCL_BG_L_BLUE 		"\e[1;44m"
#define PCL_BG_PURPLE 		"\e[0;45m"
#define PCL_BG_L_PURPLE 	"\e[1;45m"
#define PCL_BG_CYAN 		"\e[0;46m"
#define PCL_BG_L_CYAN 		"\e[1;46m"
#define PCL_BG_GRAY 		"\e[0;47m"
#define PCL_BG_WHITE 		"\e[1;47m"
//控制
#define PCL_NONE 		"\e[0m"
#define PCL_BOLD 		"\e[1m"
#define PCL_UNDERLINE 	"\e[4m"
#define PCL_BLINK 		"\e[5m"
#define PCL_REVERSE 	"\e[7m"
#define PCL_HIDE 		"\e[8m"
#define PCL_CLEAR 		"\e[2J"
#define PCL_CLRLINE	 	"\r\e[K"
#define CRLF 			"\n"


#ifndef printfColor
#define printfColor(color, ...)    \
	do                             \
	{                              \
		printf(color __VA_ARGS__); \
		printf(PCL_NONE);          \
	} while (0)
#endif

#if DEBUG_PRINTF <= DEBUG_LEVEL
#define debug_printf(...)                                              \
	do                                                               \
	{                                                                \
		printf("[debug,%s,%d,%s()] ", __FILE__, __LINE__, __func__); \
		printfColor(PCL_NONE, __VA_ARGS__);                          \
	} while (0)
#else
#define debug_printf(...)
#endif

#if DEBUG_INFO <= DEBUG_LEVEL
#define debug_info(...)                                             \
	do                                                            \
	{                                                             \
		printf("[info,%s,%d,%s] ", __FILE__, __LINE__, __func__); \
		printfColor(PCL_GREEN, __VA_ARGS__);                       \
	} while (0)
#else
#define debug_info(...)
#endif

#if DEBUG_WARN <= DEBUG_LEVEL
#define debug_warn(...)                                             \
	do                                                            \
	{                                                             \
		printf("[warn,%s,%d,%s] ", __FILE__, __LINE__, __func__); \
		printfColor(PCL_YELLOW, __VA_ARGS__);                     \
	} while (0)
#else
#define debug_warn(...)
#endif

#if DEBUG_ERROR <= DEBUG_LEVEL
#define debug_error(...)                                           \
	do                                                             \
	{                                                              \
		printf("[error,%s,%d,%s] ", __FILE__, __LINE__, __func__); \
		printfColor(PCL_L_RED, __VA_ARGS__);                       \
	} while (0)
#else
#define debug_error(...)
#endif

#if DEBUG_FATAL <= DEBUG_LEVEL
#define debug_fatal(...)                                           \
	do                                                             \
	{                                                              \
		printf("[fatal,%s,%d,%s] ", __FILE__, __LINE__, __func__); \
		printfColor(PCL_BG_L_RED, __VA_ARGS__);                    \
	} while (0)
#else
#define debug_fatal(...)
#endif

#define PRINTF_DEBUG(...) debug_printf(__VA_ARGS__)
#define PRINTF_INFO(...) debug_info(__VA_ARGS__)
#define PRINTF_WARNING(...) debug_warn(__VA_ARGS__)
#define PRINTF_ERROR(...) debug_error(__VA_ARGS__)
#define PRINTF_FATAL(...) debug_fatal(__VA_ARGS__)


/**************************************************************************************************
* 全局变量声明、定义
***************************************************************************************************/

/**************************************************************************************************
* 私有变量声明、定义
***************************************************************************************************/

/**************************************************************************************************
* 私有函数声明、定义
***************************************************************************************************/

/**************************************************************************************************
* 全局函数声明、定义
***************************************************************************************************/

#ifdef __cplusplus
}
#endif

#endif
